'use strict';

const Controller = require('egg').Controller;
const sha256 = require("js-sha256").sha256

class HomeController extends Controller {
	// 注册
	async add() {
		const { ctx, app } = this;
		const { name, memberType, phoneNumber, pwd } = ctx.request.body;

		// 参数验证
		const paramVerification = await ctx.parameter({ name, memberType, phoneNumber, pwd })
		if (paramVerification !== '') {
			return ctx.apiFail(paramVerification);
		}
		// 用于校验手机正则
		const chineseMobileRegex = /^1[3-9]\d{9}$/;
		if (!chineseMobileRegex.test(phoneNumber)) {
			return ctx.apiFail('注册失败 手机号码填写不正确');
		}
		// 获取当前日期时间
		const formattedDateTime = ctx.formatTimestamp(Date.now());

		// 判断当前昵称是否存在
		const resSelect = await app.mysql.get('user_wb', { phoneNumber });
		if (resSelect !== null) {
			return ctx.apiFail('注册失败 该账号已存在');
		}

		// 数据库插入
		const result = await app.mysql.insert('user_wb', { name, memberType, phoneNumber, addDate: formattedDateTime, pwd: sha256(pwd) });

		if (result.affectedRows !== 1) {
			return ctx.apiFail('注册失败');
		}

		return ctx.apiSuccess('注册成功');
	}

	// 登录
	async login() {
		const { ctx, app } = this;
		let { phoneNumber, pwd } = ctx.request.body;

		// 参数验证
		const paramVerification = await ctx.parameter({ phoneNumber, pwd })
		if (paramVerification !== '') {
			return ctx.apiFail(paramVerification);
		}

		// 查询账户信息
		const user = await app.mysql.get('user_wb', { phoneNumber, pwd: sha256(pwd) });
		if (user === null) {
			return ctx.apiFail('登录失败,账户或者密码错误!');
		}

		// 生成token
		// let token = ctx.getToken(JSON.parse(JSON.stringify(user)));
		// user.token = token;

		// // 加入缓存中
		// if (!await this.service.cache.set('user_wb' + user.id, token)) {
		// 	return ctx.apiFail('登录失败');
		// }

		// 返回用户信息和token
		return ctx.apiSuccess(user);
	}

	// 退出登录
	async logout() {
		const { ctx, service } = this;

		// 拿到当前用户id
		let current_user_id = ctx.authUser.id;

		// 移除redis当前用户信息
		if (!await service.cache.remove('user_' + current_user_id)) {
			ctx.throw(400, '退出登录失败');
		}
		ctx.apiSuccess('退出成功');
	}

	// 用户信息查询
	async userList() {
		const { ctx, app } = this;
		const { pages, pageNumber, phoneNumber } = ctx.query;
		// 计算偏移量
		const offset = (pageNumber - 1) * pages;
		// 参数验证
		const paramVerification = await ctx.parameter({ pages, pageNumber })
		if (paramVerification !== '') {
			return ctx.apiFail(paramVerification);
		}

		// 查询数据总记录数
		const resultsCount = await app.mysql.query('SELECT count(*) FROM user_wb');
		const sum = resultsCount[0]['count(*)']; // 总页数

		// 每页数据量
		const pageSize = pages * 1;

		// 构建 SQL 查询语句
		const sql = `SELECT * FROM user_wb WHERE phoneNumber LIKE ? LIMIT ? OFFSET ?`;

		// 执行查询
		const res = await ctx.app.mysql.query(sql, [`%${phoneNumber}%`, pageSize, offset]);

		const data = {
			list: res, // 数据
			sum, // 总记录数
			SumPages: Math.ceil(sum / pages * 1), // 总页数
			pageNumber: pageNumber * 1, // 当前页码 
		}

		return ctx.apiSuccess(data);
	}

	// 修改密码
	async updatePwd() {
		const { ctx, app } = this;
		let { id, pwd } = ctx.request.body;

		// 参数验证
		const paramVerification = await ctx.parameter({ id, pwd })
		if (paramVerification !== '') {
			return ctx.apiFail(paramVerification);
		}

		// 要修改的值
		const row = {
			pwd: sha256(pwd),
		};

		// 修改条件
		const options = {
			where: {
				id
			}
		};
		// 修改
		const result = await app.mysql.update('user_wb', row, options);

		// 判断是否成功
		if (result.affectedRows !== 1) {
			return ctx.apiFail('密码更改失败');
		}
		return ctx.apiSuccess('密码更改成功');
	}

	// 用户信息删除
	async userDel() {
		const { ctx, app } = this;
		let { id } = ctx.request.body;
		// 参数验证
		const paramVerification = await ctx.parameter({ id })
		if (paramVerification !== '') {
			return ctx.apiFail(paramVerification);
		}

		// 删除
		const result = await app.mysql.delete('User', { id });

		// 判断是否成功
		if (result.affectedRows !== 1) {
			return ctx.apiFail('删除失败');
		}

		return ctx.apiSuccess('删除成功');
	}
}

module.exports = HomeController;
